#include "EncryptWidget.h"

#include <QListWidgetItem>
#include <QTreeWidgetItem>
#include <QPair>

#include "Command.h"
#include "ContactWrapper.h"

using namespace kryptos::controller;
using namespace kryptos::entities;

namespace kryptos { namespace ui {

EncryptWidget::EncryptWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    ui.treeContacts->setColumnCount(2);
    ui.treeContacts->header()->setResizeMode(0, QHeaderView::ResizeToContents);
}

void EncryptWidget::setEncryptCommand(Command* cmd)
{
    Q_CHECK_PTR(cmd);
    m_encryptCdm = cmd;

    connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(callEncrypt()));
}

//TODO:  Al elegir un contacto simple, se deben deseleccionar las selecciones en grupos
// y viceversa.
//TODO: Se debe mostrar los miembros de cada grupo y que se puedan deseleccionar/seleccionar
// para enviar un mensaje a los miembros deseados
//TODO: mostrar icono al lado de cada contacto, simples son RSA, grupos son Vernam
void EncryptWidget::fillContactsList(GroupList contacts)
{
    foreach (const Group& group, contacts)
    {
        foreach (const Contact &contact, group.members())
        {
            QTreeWidgetItem* item = new QTreeWidgetItem(ui.treeContacts);

            item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
            item->setCheckState(0, Qt::Unchecked);
            item->setData(0, Qt::DisplayRole, QString(contact.name().c_str()) + " - " + QString(contact.email().c_str()));

            ContactWrapper contactWrapper(ContactWrapper::SINGLEKEY, QString(contact.keyInfo().keyid().c_str()));
            item->setData(1, Qt::UserRole, QVariant::fromValue(contactWrapper));
        }

        QTreeWidgetItem* item = new QTreeWidgetItem(ui.treeGroups);

        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
        item->setCheckState(0, Qt::Unchecked);
        item->setData(0, Qt::DisplayRole, QString(group.name().c_str()));

        ContactWrapper contactWrapper(ContactWrapper::GROUP, QString(group.name().c_str()));
        item->setData(1, Qt::UserRole, QVariant::fromValue(contactWrapper));
    }
}

void EncryptWidget::callEncrypt()
{
    QMap<QString, QString> params;

    QTreeWidgetItemIterator it(ui.treeContacts, QTreeWidgetItemIterator::Checked);
    while (*it)
    {
        ContactWrapper contact = qVariantValue<ContactWrapper>((*it)->data(1, Qt::UserRole));
        params.insertMulti("type", contact.typeStr());
        params.insertMulti("recipient", contact.recipient());
        ++it;
    }

    QTreeWidgetItemIterator it2(ui.treeGroups, QTreeWidgetItemIterator::Checked);
    while (*it2)
    {
        ContactWrapper contact = qVariantValue<ContactWrapper>((*it2)->data(1, Qt::UserRole));
        params.insertMulti("type", contact.typeStr());
        params.insertMulti("recipient", contact.recipient());
        ++it2;
    }

    m_encryptCdm->execute(params);
}

}}
